package com.yuxl.admin.manager.auth.core.service;

import com.yuxl.admin.common.core.utils.R;
import com.yuxl.admin.manager.auth.core.entity.AuthInterface;
import com.yuxl.admin.manager.auth.core.entity.AuthRole;
import com.yuxl.admin.manager.auth.core.repository.AuthInterfaceRepository;
import com.yuxl.admin.manager.auth.core.repository.AuthRolePowerRepository;
import com.yuxl.admin.manager.auth.core.repository.AuthRoleRepository;
import io.swagger.v3.oas.annotations.Operation;
import lombok.RequiredArgsConstructor;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.*;
import reactor.core.publisher.Flux;
import reactor.core.publisher.Mono;

import java.time.LocalDateTime;

@Service
@RequiredArgsConstructor
public class AuthInterfaceService {
    private final AuthInterfaceRepository authInterfaceRepository;
    private final AuthRolePowerRepository authRolePowerRepository;
    private final AuthRoleRepository authRoleRepository;
    /**
     * 创建新接口
     * @param entity 要创建的接口对象
     * @return 创建成功的接口对象
     */
    public Mono<AuthInterface> create(AuthInterface entity) {
        // 保存新接口到数据库
        entity.setCreateTime(LocalDateTime.now());
        return authInterfaceRepository.save(entity);
    }

    /**
     * 根据ID获取接口
     * @param id 接口ID
     * @return 接口对象
     */
    public Mono<AuthInterface> getById(Long id) {
        return authInterfaceRepository.findById(id);
    }

    /**
     * 更新接口信息
     * @param id 要更新的接口ID
     * @param entity 包含更新信息的接口对象
     * @return 更新后的接口对象
     */
    public Mono<AuthInterface> update(Long id,AuthInterface entity) {
        return authInterfaceRepository.findById(id)
                // 根据ID查找现有接口
                .flatMap(existingRole -> {
                    entity.setId(id);
                    entity.setUpdateTime(LocalDateTime.now());
                    // 更新接口信息
                    return authInterfaceRepository.save(entity);
                    // 保存更新后的接口
                });
    }

    /**
     * 删除接口
     * @param id 要删除的接口ID
     * @return 无返回值
     */
    public Mono<Void> delete(Long id) {
        return authInterfaceRepository.deleteById(id);
    }

    /**
     * 获取所有接口
     * @return 所有接口的列表
     */
    public Flux<AuthInterface> getAll() {
        return authInterfaceRepository.findAll();
    }

    /**
     * 获取接口数量
     * @return 符合条件的接口数量
     */
    public Mono<Long> count() {
        return authInterfaceRepository.count();
    }

    /**
     * 分页获取接口
     * @param page 页码
     * @param size 每页大小
     * @return 分页后的接口列表
     */
    public Flux<AuthInterface> getPage(int page,int size) {
        return authInterfaceRepository.findAll()
                // 获取所有接口
                .skip((long) page * size)
                // 跳过前面的接口
                .take(size)
                ;
    }

    /**
     * 获取接口的角色
     * @param interfaceId 接口ID
     * @return 拥有指定接口的用户列表
     */
    public Flux<AuthRole> getRoles(Long interfaceId) {
        if (interfaceId != null) {
            return
                    authRolePowerRepository.findByInterfaceId(interfaceId)
                            // 根据接口ID查找用户接口关系
                            .flatMap(roleInterface -> authRoleRepository.findById(roleInterface.getRoleId()))
            ;
            // 根据用户ID查找用户
        }else{
            return Flux.empty();
        }
    }
}
